const fs = require('fs');
const path = require('path');
const ffmpeg = require('fluent-ffmpeg');

// 读取配置文件
let config;
try {
  const configPath = path.join(__dirname, 'config-extract-frames.json');
  config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
  console.log('✅ 配置文件加载成功');
} catch (error) {
  console.error('❌ 配置文件加载失败:', error.message);
  console.error('请确保config-extract-frames.json文件存在且格式正确');
  process.exit(1);
}

class VideoFrameExtractor {
  constructor(config) {
    this.config = config;
    this.ensureOutputDir();
    this.checkFfmpegConfig();
  }

  // 确保输出目录存在
  ensureOutputDir() {
    if (!fs.existsSync(this.config.outputDir)) {
      fs.mkdirSync(this.config.outputDir, { recursive: true });
      console.log(`创建输出目录: ${this.config.outputDir}`);
    }
  }

  // 检查ffmpeg配置
  checkFfmpegConfig() {
    // 验证用户是否填写了ffmpeg路径
    if (!this.config.ffmpegExecPath) {
      console.error('❌ 错误: 请在config中填写ffmpeg.exe的完整路径');
      console.error('\n例如:');
      console.error('ffmpegExecPath: "D:\\ffmpeg\\bin\\ffmpeg.exe"');
      console.error('\n💡 如何获取ffmpeg:');
      console.error('1. 访问 https://github.com/BtbN/FFmpeg-Builds/releases');
      console.error('2. 下载适合Windows的版本（ffmpeg-master-latest-win64-gpl.zip）');
      console.error('3. 解压后找到bin/ffmpeg.exe文件');
      process.exit(1);
    }

    // 验证ffmpeg路径是否存在
    if (!fs.existsSync(this.config.ffmpegExecPath)) {
      console.error(`❌ 错误: 找不到ffmpeg.exe文件: ${this.config.ffmpegExecPath}`);
      console.error('请检查路径是否正确，确保文件存在');
      process.exit(1);
    }

    // 配置ffmpeg路径
    try {
      ffmpeg.setFfmpegPath(this.config.ffmpegExecPath);
      console.log(`✅ 已配置ffmpeg路径: ${this.config.ffmpegExecPath}`);

      // 尝试配置ffprobe（可选）
      const ffprobePath = this.config.ffmpegExecPath.replace('ffmpeg.exe', 'ffprobe.exe');
      if (fs.existsSync(ffprobePath)) {
        ffmpeg.setFfprobePath(ffprobePath);
        console.log(`✅ 已配置ffprobe路径: ${ffprobePath}`);
      } else {
        console.warn(`⚠️  未找到ffprobe.exe，部分功能可能受限`);
      }
    } catch (error) {
      console.error(`❌ 配置ffmpeg失败: ${error.message}`);
      process.exit(1);
    }
  }

  // 格式化序号，确保两位数
  formatFrameNumber(number) {
    return number.toString().padStart(2, '0');
  }

  // 提取视频帧
  extractFrames() {
    return new Promise((resolve, reject) => {
      // 验证视频文件是否存在
      if (!fs.existsSync(this.config.videoPath)) {
        const error = new Error(`视频文件不存在: ${this.config.videoPath}`);
        console.error('❌ ' + error.message);
        reject(error);
        return;
      }

      // 从视频路径提取文件名作为前缀（去掉扩展名）
      const videoFilename = path.basename(this.config.videoPath);
      const videoNameWithoutExt = videoFilename.substring(0, videoFilename.lastIndexOf('.'));

      console.log(`\n=== 开始提取视频帧 ===`);
      console.log(`视频文件: ${this.config.videoPath}`);
      console.log(`输出目录: ${this.config.outputDir}`);
      console.log(`输出格式: ${this.config.frameFormat}`);
      console.log(`文件前缀: ${videoNameWithoutExt}`);

      const outputPattern = path.join(
        this.config.outputDir,
        `${videoNameWithoutExt}-%02d.${this.config.frameFormat}`
      );

      ffmpeg(this.config.videoPath)
        .on('end', () => {
          console.log('\n✅ 视频帧提取完成!');
          console.log(`帧图片已保存到: ${this.config.outputDir}`);
          resolve();
        })
        .on('error', (err) => {
          console.error('\n❌ 视频帧提取失败:', err.message);

          // 处理spawn UNKNOWN错误，可能是ffmpeg架构与系统不兼容
          if (err.message.includes('spawn UNKNOWN')) {
            console.error('\n💡 可能的原因:');
            console.error('1. ffmpeg架构与您的系统不兼容');
            console.error('   - 您当前使用的是: ' + path.basename(path.dirname(path.dirname(this.config.ffmpegExecPath))));
            console.error('   - Windows x64系统请下载: ffmpeg-*-win64-*.zip');
            console.error('   - Windows ARM64系统请下载: ffmpeg-*-winarm64-*.zip');
            console.error('2. 请访问 https://github.com/BtbN/FFmpeg-Builds/releases 下载正确架构的版本');
          }

          reject(err);
        })
        .on('progress', (progress) => {
          if (progress.percent) {
            process.stdout.write(`\r进度: ${progress.percent.toFixed(2)}%`);
          }
        })
        .output(outputPattern)
        .outputOptions(['-vf fps=1/1', '-start_number 1']) // 每秒1帧，从1开始编号
        .run();
    });
  }
}

// 运行
async function main() {
  try {
    const extractor = new VideoFrameExtractor(config);
    await extractor.extractFrames();
  } catch (error) {
    // 错误信息已经在extractFrames方法中详细打印，这里不再重复
    process.exit(1);
  }
}

main();